package com.kaifamiao.store.system.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;

@Slf4j
public class JwtUtils {
    // 过期时间
    public static final long EXPIRATION_TIME = 1000 * 60 * 60 * 24;
    // 秘钥
    private static final String SECRET_KEY = "HSyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9";

    /**
     * 创建一个token
     *
     * @param obj
     * @return
     */
    public static String generateToken(String obj) {
        Date expireDate = new Date(System.currentTimeMillis() + EXPIRATION_TIME);
        return Jwts.builder()
                // 设置 header 参数
                .setHeaderParam("type", "JWT")
                // 设置 payload 参数， user信息存到jwt中（user -> json）
                .setSubject(obj)
                // 设置过期时间
                .setExpiration(expireDate)
                // 设置签名使用的签名算法和签名使用的秘钥
                .signWith(
                        SignatureAlgorithm.HS512, SECRET_KEY).compact();
    }

    /**
     * 解析token
     */
    public static Claims getClaimsByToken(String token) {
        try {
            return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
        } catch (ExpiredJwtException ex){
            log.error("token 已过期", ex);
            throw new JwtException("token 已过期");
        } catch (Exception e) {
            log.error("token 解析异常", e);
            throw new JwtException("token 解析异常");
        }
    }

    public static String getSubjectByToken(String token){
        return getClaimsByToken(token).getSubject();
    }

    /**
     * 判断 token 是否过期
     */
    public static boolean isTokenExpired(Date expiration){
        return expiration.before(new Date());
    }


    public static void main(String[] args) {
        String token = generateToken("1234");
        System.out.println(getClaimsByToken(token).getSubject());
    }

    public static class JwtException extends RuntimeException{
        public JwtException(String message) {
            super(message);
        }
    }
}
